/******************************************************************************* * Copyright (c) 2000, 2017 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.eclipse.dltk.internal.corext.refactoring.rename; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IProjectFragment; import org.eclipse.dltk.core.IScriptFolder; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.IType; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.internal.corext.refactoring.Checks; import org.eclipse.dltk.internal.corext.refactoring.RefactoringAvailabilityTester; import org.eclipse.dltk.internal.corext.refactoring.RefactoringCoreMessages; import org.eclipse.dltk.internal.corext.refactoring.ScriptRefactoringArguments; import org.eclipse.dltk.internal.corext.refactoring.ScriptRefactoringDescriptor; import org.eclipse.dltk.internal.corext.refactoring.ScriptRefactoringDescriptorComment; import org.eclipse.dltk.internal.corext.refactoring.base.ScriptStatusContext; import org.eclipse.dltk.internal.corext.refactoring.changes.DynamicValidationRefactoringChange; import org.eclipse.dltk.internal.corext.refactoring.changes.RenameScriptFolderChange; import org.eclipse.dltk.internal.corext.refactoring.code.ScriptableRefactoring; import org.eclipse.dltk.internal.corext.refactoring.participants.ScriptProcessors; import org.eclipse.dltk.internal.corext.refactoring.tagging.IQualifiedNameUpdating; import org.eclipse.dltk.internal.corext.refactoring.tagging.IReferenceUpdating; import org.eclipse.dltk.internal.corext.refactoring.tagging.ITextUpdating; import org.eclipse.dltk.internal.corext.refactoring.util.ModelElementUtil; import org.eclipse.dltk.internal.corext.refactoring.util.ResourceUtil; import org.eclipse.dltk.internal.corext.refactoring.util.TextChangeManager; import org.eclipse.dltk.internal.corext.util.Messages; import org.eclipse.dltk.internal.corext.util.Resources; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.RefactoringStatusContext; import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; import org.eclipse.ltk.core.refactoring.participants.RefactoringArguments; import org.eclipse.ltk.core.refactoring.participants.RenameArguments; public class RenameScriptFolderProcessor extends ScriptRenameProcessor implements IReferenceUpdating, ITextUpdating, IQualifiedNameUpdating { private static final String ID_RENAME_PACKAGE = "org.eclipse.dltk.ui.rename.script.folder"; //$NON-NLS-1$ private static final String ATTRIBUTE_QUALIFIED = "qualified"; //$NON-NLS-1$ private static final String ATTRIBUTE_REFERENCES = "references"; //$NON-NLS-1$ private static final String ATTRIBUTE_TEXTUAL_MATCHES = "textual"; //$NON-NLS-1$ private static final String ATTRIBUTE_PATTERNS = "patterns"; //$NON-NLS-1$ private static final String ATTRIBUTE_HIERARCHICAL = "hierarchical"; //$NON-NLS-1$ private IScriptFolder fPackage; private TextChangeManager fChangeManager; static { if (DLTKCore.DEBUG) { System.err.println( "TODO: RenameScriptFolderProcessor add import manager supprot code here..."); //$NON-NLS-1$ } } // private ImportsManager fImportsManager; // private QualifiedNameSearchResult fQualifiedNameSearchResult; private boolean fUpdateReferences; private boolean fUpdateTextualMatches; private boolean fUpdateQualifiedNames; private String fFilePatterns; private boolean fRenameSubpackages; public static final String IDENTIFIER = "org.eclipse.dltk.ui.renamePackageProcessor"; //$NON-NLS-1$ /** * Creates a new rename package processor. * * @param fragment * the package fragment, or <code>null</code> if invoked by * scripting */ public RenameScriptFolderProcessor(IScriptFolder fragment) { fPackage = fragment; if (fPackage != null) setNewElementName(fPackage.getElementName()); fUpdateReferences = true; fUpdateTextualMatches = false; fRenameSubpackages = true; } @Override public String getIdentifier() { return IDENTIFIER; } @Override public boolean isApplicable() throws CoreException { return RefactoringAvailabilityTester.isRenameAvailable(fPackage); } @Override public String getProcessorName() { return RefactoringCoreMessages.RenamePackageRefactoring_name; } @Override protected String[] getAffectedProjectNatures() throws CoreException { return ScriptProcessors.computeAffectedNatures(fPackage); } @Override public Object[] getElements() { return new Object[] { fPackage }; } @Override protected RenameModifications computeRenameModifications() throws CoreException { RenameModifications result = new RenameModifications(); result.rename(fPackage, new RenameArguments(getNewElementName(), getUpdateReferences()), fRenameSubpackages); return result; } @Override protected IFile[] getChangedFiles() throws CoreException { Set<IFile> combined = new HashSet<>(); combined.addAll(Arrays.asList( ResourceUtil.getFiles(fChangeManager.getAllSourceModules()))); if (fRenameSubpackages) { IScriptFolder[] allPackages = ModelElementUtil .getPackageAndSubpackages(fPackage); for (int i = 0; i < allPackages.length; i++) { combined.addAll(Arrays.asList(ResourceUtil .getFiles(allPackages[i].getSourceModules()))); } } else { combined.addAll(Arrays.asList( ResourceUtil.getFiles(fPackage.getSourceModules()))); } if (DLTKCore.DEBUG) { System.err.println( "TODO: RenameScriptFolderProcessor Add fQualifiedNameSearchResult suppor code"); //$NON-NLS-1$ } // if (fQualifiedNameSearchResult != null) // combined.addAll(Arrays.asList(fQualifiedNameSearchResult.getAllFiles())); return combined.toArray(new IFile[combined.size()]); } // ---- ITextUpdating ------------------------------------------------- @Override public boolean canEnableTextUpdating() { return true; } @Override public boolean getUpdateTextualMatches() { return fUpdateTextualMatches; } @Override public void setUpdateTextualMatches(boolean update) { fUpdateTextualMatches = update; } // ---- IReferenceUpdating -------------------------------------- @Override public boolean canEnableUpdateReferences() { return true; } @Override public void setUpdateReferences(boolean update) { fUpdateReferences = update; } @Override public boolean getUpdateReferences() { return fUpdateReferences; } // ---- IQualifiedNameUpdating ---------------------------------- @Override public boolean canEnableQualifiedNameUpdating() { return !fPackage.isRootFolder(); } @Override public boolean getUpdateQualifiedNames() { return fUpdateQualifiedNames; } @Override public void setUpdateQualifiedNames(boolean update) { fUpdateQualifiedNames = update; } @Override public String getFilePatterns() { return fFilePatterns; } @Override public void setFilePatterns(String patterns) { Assert.isNotNull(patterns); fFilePatterns = patterns; } // ---- public boolean canEnableRenameSubpackages() throws ModelException { return fPackage.hasSubfolders(); } public boolean getRenameSubpackages() { return fRenameSubpackages; } public void setRenameSubpackages(boolean rename) { fRenameSubpackages = rename; } // ---- IRenameProcessor ---------------------------------------------- @Override public final String getCurrentElementName() { return fPackage.getElementName(); } @Override public String getCurrentElementQualifier() { return ""; //$NON-NLS-1$ } @Override public RefactoringStatus checkNewElementName(String newName) throws CoreException { Assert.isNotNull(newName, "new name"); //$NON-NLS-1$ // RefactoringStatus result= Checks.checkPackageName(newName); if (DLTKCore.DEBUG) { System.err.println( "TODO: Add correct package name validation here..."); //$NON-NLS-1$ } // #replace begin RefactoringStatus result = new RefactoringStatus(); if ("".equals(newName)) //$NON-NLS-1$ return RefactoringStatus.createFatalErrorStatus( RefactoringCoreMessages.Checks_Choose_name); // #end if (Checks.isAlreadyNamed(fPackage, newName)) result.addFatalError( RefactoringCoreMessages.RenamePackageRefactoring_another_name); result.merge(checkPackageInCurrentRoot(newName)); return result; } @Override public Object getNewElement() { IModelElement parent = fPackage.getParent(); if (!(parent instanceof IProjectFragment)) return fPackage;// ?? IProjectFragment root = (IProjectFragment) parent; return root.getScriptFolder(getNewElementName()); } @Override public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException { return new RefactoringStatus(); } @Override protected RefactoringStatus doCheckFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException { try { pm.beginTask("", 23 + (fUpdateQualifiedNames ? 10 : 0)); //$NON-NLS-1$ pm.setTaskName( RefactoringCoreMessages.RenamePackageRefactoring_checking); RefactoringStatus result = new RefactoringStatus(); result.merge(checkNewElementName(getNewElementName())); pm.worked(1); // result.merge(checkForMainAndNativeMethods()); pm.worked(2); if (fPackage.isReadOnly()) { String message = Messages.format( RefactoringCoreMessages.RenamePackageRefactoring_Packagered_only, fPackage.getElementName()); result.addFatalError(message); } else if (Resources.isReadOnly(fPackage.getResource())) { String message = Messages.format( RefactoringCoreMessages.RenamePackageRefactoring_resource_read_only, fPackage.getElementName()); result.addError(message); } result.merge(checkPackageName(getNewElementName())); if (result.hasFatalError()) return result; fChangeManager = new TextChangeManager(); // fImportsManager= new ImportsManager(); SubProgressMonitor subPm = new SubProgressMonitor(pm, 16); if (fRenameSubpackages) { IScriptFolder[] allSubpackages = ModelElementUtil .getPackageAndSubpackages(fPackage); subPm.beginTask("", allSubpackages.length); //$NON-NLS-1$ for (int i = 0; i < allSubpackages.length; i++) { new PackageRenamer(allSubpackages[i], this, fChangeManager/* , fImportsManager */).doRename( new SubProgressMonitor(subPm, 1), result); } subPm.done(); } else { new PackageRenamer(fPackage, this, fChangeManager/* , fImportsManager */).doRename(subPm, result); } // fImportsManager.rewriteImports(fChangeManager, new // SubProgressMonitor(pm, 3)); if (DLTKCore.DEBUG) { System.err .println("TODO: Add updating of fUpdateQualifiedNames"); //$NON-NLS-1$ } // if (fUpdateQualifiedNames) // computeQualifiedNameMatches(new SubProgressMonitor(pm, 10)); return result; } finally { pm.done(); } } public IScriptFolder getPackage() { return fPackage; } /* * returns true if the new name is ok if the specified root. if a package * fragment with this name exists and has script resources, then the name is * not ok. */ public static boolean isPackageNameOkInRoot(String newName, IProjectFragment root) throws CoreException { IScriptFolder pack = root.getScriptFolder(newName); if (!pack.exists()) return true; else if (!pack.hasSubfolders()) // leaves are no good return false; else if (pack.containsScriptResources()) return false; else if (pack.getForeignResources().length != 0) return false; else return true; } private RefactoringStatus checkPackageInCurrentRoot(String newName) throws CoreException { if (isPackageNameOkInRoot(newName, getProjectFragment())) return null; else return RefactoringStatus.createFatalErrorStatus( RefactoringCoreMessages.RenamePackageRefactoring_package_exists); } private IProjectFragment getProjectFragment() { return ((IProjectFragment) fPackage.getParent()); } private RefactoringStatus checkPackageName(String newName) throws CoreException { RefactoringStatus status = new RefactoringStatus(); IProjectFragment[] roots = fPackage.getScriptProject() .getProjectFragments(); Set topLevelTypeNames = getTopLevelTypeNames(); for (int i = 0; i < roots.length; i++) { if (!isPackageNameOkInRoot(newName, roots[i])) { String message = Messages.format( RefactoringCoreMessages.RenamePackageRefactoring_aleady_exists, new Object[] { getNewElementName(), roots[i].getElementName() }); status.merge(RefactoringStatus.createWarningStatus(message)); status.merge(checkTypeNameConflicts(roots[i], newName, topLevelTypeNames)); } } return status; } private Set getTopLevelTypeNames() throws CoreException { ISourceModule[] cus = fPackage.getSourceModules(); Set result = new HashSet(2 * cus.length); for (int i = 0; i < cus.length; i++) { result.addAll(getTopLevelTypeNames(cus[i])); } return result; } private static Collection getTopLevelTypeNames(ISourceModule iSourceModule) throws CoreException { IType[] types = iSourceModule.getTypes(); List result = new ArrayList(types.length); for (int i = 0; i < types.length; i++) { result.add(types[i].getElementName()); } return result; } private RefactoringStatus checkTypeNameConflicts(IProjectFragment root, String newName, Set topLevelTypeNames) throws CoreException { IScriptFolder otherPack = root.getScriptFolder(newName); if (fPackage.equals(otherPack)) return null; ISourceModule[] cus = otherPack.getSourceModules(); RefactoringStatus result = new RefactoringStatus(); for (int i = 0; i < cus.length; i++) { result.merge(checkTypeNameConflicts(cus[i], topLevelTypeNames)); } return result; } private RefactoringStatus checkTypeNameConflicts( ISourceModule iSourceModule, Set topLevelTypeNames) throws CoreException { RefactoringStatus result = new RefactoringStatus(); IType[] types = iSourceModule.getTypes(); String packageName = iSourceModule.getParent().getElementName(); for (int i = 0; i < types.length; i++) { String name = types[i].getElementName(); if (topLevelTypeNames.contains(name)) { String[] keys = { packageName, name }; String msg = Messages.format( RefactoringCoreMessages.RenamePackageRefactoring_contains_type, keys); RefactoringStatusContext context = ScriptStatusContext .create(types[i]); result.addError(msg, context); } } return result; } @Override public Change createChange(IProgressMonitor monitor) throws CoreException { try { monitor.beginTask( RefactoringCoreMessages.RenamePackageRefactoring_creating_change, 1); final Map arguments = new HashMap(); String project = null; IScriptProject scriptProject = fPackage.getScriptProject(); if (scriptProject != null) project = scriptProject.getElementName(); final int flags = ScriptRefactoringDescriptor.ARCHIVE_IMPORTABLE | ScriptRefactoringDescriptor.ARCHIVE_REFACTORABLE | RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE; final String description = Messages.format( RefactoringCoreMessages.RenamePackageProcessor_descriptor_description_short, fPackage.getElementName()); final String header = Messages.format( RefactoringCoreMessages.RenamePackageProcessor_descriptor_description, new String[] { fPackage.getElementName(), getNewElementName() }); final ScriptRefactoringDescriptorComment comment = new ScriptRefactoringDescriptorComment( this, header); if (fRenameSubpackages) comment.addSetting( RefactoringCoreMessages.RenamePackageProcessor_rename_subpackages); final ScriptRefactoringDescriptor descriptor = new ScriptRefactoringDescriptor( ID_RENAME_PACKAGE, project, description, comment.asString(), arguments, flags); arguments.put(ScriptRefactoringDescriptor.ATTRIBUTE_INPUT, descriptor.elementToHandle(fPackage)); arguments.put(ScriptRefactoringDescriptor.ATTRIBUTE_NAME, getNewElementName()); if (fFilePatterns != null && !"".equals(fFilePatterns)) //$NON-NLS-1$ arguments.put(ATTRIBUTE_PATTERNS, fFilePatterns); arguments.put(ATTRIBUTE_REFERENCES, Boolean.valueOf(fUpdateReferences).toString()); arguments.put(ATTRIBUTE_QUALIFIED, Boolean.valueOf(fUpdateQualifiedNames).toString()); arguments.put(ATTRIBUTE_TEXTUAL_MATCHES, Boolean.valueOf(fUpdateTextualMatches).toString()); arguments.put(ATTRIBUTE_HIERARCHICAL, Boolean.valueOf(fRenameSubpackages).toString()); final DynamicValidationRefactoringChange result = new DynamicValidationRefactoringChange( descriptor, RefactoringCoreMessages.RenamePackageRefactoring_change_name); result.addAll(fChangeManager.getAllChanges()); result.add(new RenameScriptFolderChange(null, fPackage, getNewElementName(), comment.asString(), fRenameSubpackages)); monitor.worked(1); return result; } finally { fChangeManager = null; // fImportsManager= null; monitor.done(); } } @Override public Change postCreateChange(Change[] participantChanges, IProgressMonitor pm) throws CoreException { // if (fQualifiedNameSearchResult != null) { // try { // return // fQualifiedNameSearchResult.getSingleChange(Changes.getModifiedFiles(participantChanges)); // } finally { // fQualifiedNameSearchResult= null; // } // } else { return null; // } } public String getNewPackageName(String oldSubPackageName) { String oldPackageName = getPackage().getElementName(); return getNewElementName() + oldSubPackageName.substring(oldPackageName.length()); } private static class PackageRenamer { private final IScriptFolder fPackage; private final RenameScriptFolderProcessor fProcessor; // private final TextChangeManager fTextChangeManager; // private final ImportsManager fImportsManager; /** * references to fPackage (can include star imports which also import * namesake package fragments) */ // private SearchResultGroup[] fOccurrences; /** * References in CUs from fOccurrences and fPackage to types in namesake * packages. * <p> * These need an import with the old package name. * <p> * - from fOccurrences (without namesakes): may have shared star import * (star-import not updated here, but for fOccurrences) * <p> * - from fPackage: may have unimported references to types of namesake * packages * <p> * - both: may have unused imports of namesake packages. * <p> * Mutable List of SearchResultGroup. */ // private List fReferencesToTypesInNamesakes; /** * References in CUs from namesake packages to types in fPackage. * <p> * These need an import with the new package name. * <p> * Mutable List of SearchResultGroup. */ // private List fReferencesToTypesInPackage; public PackageRenamer(IScriptFolder pack, RenameScriptFolderProcessor processor, TextChangeManager textChangeManager/* * , ImportsManager * importsManager */) { fPackage = pack; fProcessor = processor; // fTextChangeManager= textChangeManager; // fImportsManager= importsManager; } void doRename(IProgressMonitor pm, RefactoringStatus result) throws CoreException { pm.beginTask("", //$NON-NLS-1$ 16 + (fProcessor.getUpdateTextualMatches() ? 10 : 0)); if (fProcessor.getUpdateReferences()) { pm.setTaskName( RefactoringCoreMessages.RenamePackageRefactoring_searching); // fOccurrences= getReferences(new SubProgressMonitor(pm, 4), // result); // fReferencesToTypesInNamesakes= // getReferencesToTypesInNamesakes(new SubProgressMonitor(pm, // 4), result); // fReferencesToTypesInPackage= // getReferencesToTypesInPackage(new SubProgressMonitor(pm, 4), // result); pm.setTaskName( RefactoringCoreMessages.RenamePackageRefactoring_checking); result.merge(analyzeAffectedSourceModules()); pm.worked(1); } else { // fOccurrences= new SearchResultGroup[0]; pm.worked(13); } if (result.hasFatalError()) return; if (fProcessor.getUpdateReferences()) addReferenceUpdates(new SubProgressMonitor(pm, 3)); else pm.worked(3); if (fProcessor.getUpdateTextualMatches() && fPackage.equals(fProcessor.getPackage())) { pm.subTask( RefactoringCoreMessages.RenamePackageRefactoring_searching_text); // addTextMatches(new SubProgressMonitor(pm, 10)); } pm.done(); } private RefactoringStatus analyzeAffectedSourceModules() throws CoreException { // TODO: also for both fReferencesTo...; only check each CU once! RefactoringStatus result = new RefactoringStatus(); // fOccurrences= Checks.excludeSourceModules(fOccurrences, result); if (result.hasFatalError()) return result; // result.merge(Checks.checkCompileErrorsInAffectedFiles(fOccurrences)); return result; } private void addReferenceUpdates(IProgressMonitor pm) throws CoreException { if (DLTKCore.DEBUG) { System.err.println("TODO: Add search support code."); //$NON-NLS-1$ } // if (fReferencesToTypesInNamesakes.size() != 0) { // for (Iterator iter= fReferencesToTypesInNamesakes.iterator(); // iter.hasNext();) { // //SearchResultGroup referencesToTypesInNamesakes= // (SearchResultGroup) iter.next(); // //addTypeImports(referencesToTypesInNamesakes); // pm.worked(1); // } // } // if (fReferencesToTypesInPackage.size() != 0) { // for (Iterator iter= fReferencesToTypesInPackage.iterator(); // iter.hasNext();) { // //SearchResultGroup namesakeReferencesToPackage= // (SearchResultGroup) iter.next(); // //updateTypeImports(namesakeReferencesToPackage); // pm.worked(1); // } // } pm.done(); } // private static String cutOffInnerTypes(String reference) { // int dotPos= reference.indexOf('.'); // cut off inner types // if (dotPos != -1) // reference= reference.substring(0, dotPos); // return reference; // } // // private String getNewPackageName() { // return fProcessor.getNewPackageName(fPackage.getElementName()); // } } @Override public RefactoringStatus initialize(RefactoringArguments arguments) { if (arguments instanceof ScriptRefactoringArguments) { final ScriptRefactoringArguments extended = (ScriptRefactoringArguments) arguments; final String handle = extended .getAttribute(ScriptRefactoringDescriptor.ATTRIBUTE_INPUT); if (handle != null) { final IModelElement element = ScriptRefactoringDescriptor .handleToElement(extended.getProject(), handle, false); if (element == null || !element.exists() || element .getElementType() != IModelElement.SCRIPT_FOLDER) return ScriptableRefactoring.createInputFatalStatus(element, getRefactoring().getName(), ID_RENAME_PACKAGE); else fPackage = (IScriptFolder) element; } else return RefactoringStatus.createFatalErrorStatus(Messages.format( RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, ScriptRefactoringDescriptor.ATTRIBUTE_INPUT)); final String name = extended .getAttribute(ScriptRefactoringDescriptor.ATTRIBUTE_NAME); if (name != null && !"".equals(name)) //$NON-NLS-1$ setNewElementName(name); else return RefactoringStatus.createFatalErrorStatus(Messages.format( RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, ScriptRefactoringDescriptor.ATTRIBUTE_NAME)); final String patterns = extended.getAttribute(ATTRIBUTE_PATTERNS); if (patterns != null && !"".equals(patterns)) //$NON-NLS-1$ fFilePatterns = patterns; else fFilePatterns = ""; //$NON-NLS-1$ final String references = extended .getAttribute(ATTRIBUTE_REFERENCES); if (references != null) { fUpdateReferences = Boolean.valueOf(references).booleanValue(); } else return RefactoringStatus.createFatalErrorStatus(Messages.format( RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, ATTRIBUTE_REFERENCES)); final String matches = extended .getAttribute(ATTRIBUTE_TEXTUAL_MATCHES); if (matches != null) { fUpdateTextualMatches = Boolean.valueOf(matches).booleanValue(); } else return RefactoringStatus.createFatalErrorStatus(Messages.format( RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, ATTRIBUTE_TEXTUAL_MATCHES)); final String qualified = extended.getAttribute(ATTRIBUTE_QUALIFIED); if (qualified != null) { fUpdateQualifiedNames = Boolean.valueOf(qualified) .booleanValue(); } else return RefactoringStatus.createFatalErrorStatus(Messages.format( RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, ATTRIBUTE_QUALIFIED)); final String hierarchical = extended .getAttribute(ATTRIBUTE_HIERARCHICAL); if (hierarchical != null) { fRenameSubpackages = Boolean.valueOf(hierarchical) .booleanValue(); } else return RefactoringStatus.createFatalErrorStatus(Messages.format( RefactoringCoreMessages.InitializableRefactoring_argument_not_exist, ATTRIBUTE_HIERARCHICAL)); } else return RefactoringStatus.createFatalErrorStatus( RefactoringCoreMessages.InitializableRefactoring_inacceptable_arguments); return new RefactoringStatus(); } }